/**
 ****************************************************************************************************
 * @file        usart.c
 * @author      LXP
 * @version     V1.0
 * @date        2024-08-07
 * @brief       串口代码，支持printf
 **************************************************************************************************/

#ifndef __UART_H_
#define __UART_H_

#include "uart.h"
#include "usart.h"







/* 接收缓冲, 最大USART_REC_LEN个字节. */
volatile uint8_t g_rs232_rx_buf[RS232_REC_LEN];
volatile uint8_t g_rs485_rx_buf[RS485_REC_LEN];
volatile uint8_t g_ttl_rx_buf[TTL_REC_LEN];
/* 串口缓冲区读取索引 */
volatile uint8_t g_rs232ReadIndex = 0;
volatile uint8_t g_rs232WriteIndex = 0;
volatile uint8_t g_rs485ReadIndex = 0;
volatile uint8_t g_rs485WriteIndex = 0;
volatile uint8_t g_ttlReadIndex = 0;
volatile uint8_t g_ttlWriteIndex = 0;
/* 以下HAL库接收Buffer */
volatile uint8_t  g_rs232_rxByte[RXBUFFERSIZE];
volatile uint8_t  g_rs485_rxByte[RXBUFFERSIZE];
volatile uint8_t  g_ttl_rxByte[RXBUFFERSIZE];
/*  接收状态
 *  bit15，      接收完成标志
 *  bit14，      接收到0x0d
 *  bit13~0，    接收到的有效字节数目
*/
//volatile uint16_t g_rs232_rx_sta = 0;
//volatile uint16_t g_rs485_rx_sta = 0;
//volatile uint16_t g_ttl_rx_sta = 0;

/*****************************************************************************************
 * @brief       Printf函数需要调用的函数
 * @param       CH: 字符
 * @retval      返回值：超时返回-1，成功返回输入字符
 *
******************************************************************************************/

int __io_putchar(int ch)
{
	if(HAL_UART_Transmit(&huart2,(uint8_t *)&ch,1,5000))
	{
		return -1;
	}
//	while((USART_RS485->SR & 0X40) == 0);
//	USART_RS485->DR = (uint8_t)ch;
	return ch;
}

/**
 * @brief       串口X初始化函数
 * @param       无
 * @retval      无
 */
void usart_init()
{
    /* 开启接收中断：标志位UART_IT_RXNE，并且设置接收缓冲以及接收缓冲接收最大数据量 */
	HAL_UART_Receive_IT(&huart1, (uint8_t *)g_rs232_rxByte, RXBUFFERSIZE);
	HAL_UART_Receive_IT(&huart3, (uint8_t *)g_rs485_rxByte, RXBUFFERSIZE);
	HAL_UART_Receive_IT(&huart2, (uint8_t *)g_ttl_rxByte, RXBUFFERSIZE);
	//485接口默认使能发送
	UART_RS485_DIR_TX;
//	//485接口默认使能接收
//	UART_RS485_DIR_RX;
	//各索引归0
	g_rs232ReadIndex = 0;
	g_rs232WriteIndex = 0;
	g_rs485ReadIndex = 0;
	g_rs485WriteIndex = 0;
	g_ttlReadIndex = 0;
	g_ttlWriteIndex = 0;
}

/*****************************************************************************************
 * @brief       获取缓冲区有效字节数
 * @param       无
 * @retval      返回接收字节数
******************************************************************************************/
uint16_t RS232_GetBuffValidByte()
{
	return ((g_rs232WriteIndex + RS232_REC_LEN) - g_rs232ReadIndex) % RS232_REC_LEN;
}
uint16_t RS485_GetBuffValidByte()
{
	return ((g_rs485WriteIndex + RS485_REC_LEN) - g_rs485ReadIndex) % RS485_REC_LEN;
}
uint16_t TTL_GetBuffValidByte()
{
	return ((g_ttlWriteIndex + TTL_REC_LEN) - g_ttlReadIndex) % TTL_REC_LEN;
}
/*****************************************************************************************
 * @brief       获取缓冲区还有多少字节未使用
 * @param       无
 * @retval      返回空余字节数
******************************************************************************************/
uint16_t RS232_GetBuffEmptyByte()
{
	if(g_rs232ReadIndex == g_rs232WriteIndex)
	{
		return RS232_REC_LEN-1;
	}
	return (((g_rs232ReadIndex + RS232_REC_LEN) - g_rs232WriteIndex) % RS232_REC_LEN)-1;
}
uint16_t RS485_GetBuffEmptyByte()
{
	if(g_rs485ReadIndex == g_rs485WriteIndex)
	{
		return RS485_REC_LEN-1;
	}
	return (((g_rs485ReadIndex + RS485_REC_LEN) - g_rs485WriteIndex) % RS485_REC_LEN)-1;
}
uint16_t TTL_GetBuffEmptyByte()
{
	if(g_ttlReadIndex == g_ttlWriteIndex)
	{
		return TTL_REC_LEN-1;
	}
	return (((g_ttlReadIndex + TTL_REC_LEN) - g_ttlWriteIndex) % TTL_REC_LEN)-1;
}
/*****************************************************************************************
 * @brief       获取缓冲区1个字节
 * @param       无
 * @retval      返回1个字节数据
******************************************************************************************/
uint8_t  RS232_GetByte()
{
	uint8_t retValue = g_rs232_rx_buf[g_rs232ReadIndex++];
	if(g_rs232ReadIndex == RS232_REC_LEN)
	{
		g_rs232ReadIndex = 0;
	}
	return retValue;
}
uint8_t  RS485_GetByte()
{
	uint8_t retValue = g_rs485_rx_buf[g_rs485ReadIndex++];
	if(g_rs485ReadIndex == RS485_REC_LEN)
	{
		g_rs485ReadIndex = 0;
	}
	return retValue;
}
uint8_t  TTL_GetByte()
{
	uint8_t retValue = g_ttl_rx_buf[g_ttlReadIndex++];
	if(g_ttlReadIndex == TTL_REC_LEN)
	{
		g_ttlReadIndex = 0;
	}
	return retValue;
}
/*****************************************************************************************
 * @brief       Rx传输回调函数
 * @param       huart: UART句柄类型指针
 * @retval      无
******************************************************************************************/
#if 0
//extern uint8_t rx_datNum;
//extern DMA_HandleTypeDef hdma_uart4_rx;
//void USAR_UART_IDLECallback(UART_HandleTypeDef *huart)
//{
//    HAL_UART_DMAStop(huart);
//    rx_datNum = 50 - __HAL_DMA_GET_COUNTER(&hdma_uart4_rx);   //计算接收到的数据长度
//
//}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    if (huart->Instance == USART_RS232)            /* 如果是232接口 */
    {
    	//判断是否空闲中断
    	if(__HAL_UART_GET_FLAG(huart, UART_FLAG_IDLE != RESET))
    	{
    		__HAL_UART_CLEAR_IDLEFLAG(huart);                     //清楚空闲中断标志（否则会一直不断进入中断）
//    		USAR_UART_IDLECallback(huart); 	//用于搬运DMA数据
    	}
//		if(RS232_GetBuffEmptyByte() == 0)
//		{
//			//如果缓冲区满数据丢弃
//		}else
//		{
//			//如果到达尾部重0再次开始
//			if(g_rs232WriteIndex == RS232_REC_LEN)
//			{
//				g_rs232WriteIndex = 0;
//			}
//			g_rs232_rx_buf[g_rs232WriteIndex++] = g_rs232_rxByte[0];
//#if	RS232_BUSY_EN
//			if(RS232_GetBuffEmptyByte() == 0)
//			{
//				//如有忙信号，此处置忙
//			}
//#endif
//		}
//        HAL_UART_Receive_IT(&huart4, (uint8_t *)g_rs232_rxByte, RXBUFFERSIZE);
    }else if(huart->Instance == USART_RS485)
    {
    	//判断是否空闲中断
		if(__HAL_UART_GET_FLAG(huart, UART_FLAG_IDLE != RESET))
		{
			__HAL_UART_CLEAR_IDLEFLAG(huart);                     //清楚空闲中断标志（否则会一直不断进入中断）
//    		USAR_UART_IDLECallback(huart); 	//用于搬运DMA数据
		}
//		if(RS485_GetBuffEmptyByte() == 0)
//		{
//			//如果缓冲区满数据丢弃
//		}else
//		{
//			//如果到达尾部重0再次开始
//			if(g_rs485WriteIndex == RS485_REC_LEN)
//			{
//				g_rs485WriteIndex = 0;
//			}
//			g_rs485_rx_buf[g_rs485WriteIndex++] = g_rs485_rxByte[0];
//#if	RS485_BUSY_EN
//			if(RS485_GetBuffEmptyByte() == 0)
//			{
//				//如有忙信号，此处置忙
//			}
//#endif
//		}
//		HAL_UART_Receive_IT(&huart5, (uint8_t *)g_rs485_rxByte, RXBUFFERSIZE);
    }else if(huart->Instance == USART_TTL)
    {
    	//判断是否空闲中断
		if(__HAL_UART_GET_FLAG(huart, UART_FLAG_IDLE != RESET))
		{
			__HAL_UART_CLEAR_IDLEFLAG(huart);                     //清楚空闲中断标志（否则会一直不断进入中断）
//    		USAR_UART_IDLECallback(huart); 	//用于搬运DMA数据
		}
//		if(TTL_GetBuffEmptyByte() == 0)
//		{
//			//如果缓冲区满数据丢弃
//		}else
//		{
//			//如果到达尾部重0再次开始
//			if(g_ttlWriteIndex == TTL_REC_LEN)
//			{
//				g_ttlWriteIndex = 0;
//			}
//			g_ttl_rx_buf[g_ttlWriteIndex++] = g_ttl_rxByte[0];
//#if	TTL_BUSY_EN
//			if(TTL_GetBuffEmptyByte() == 0)
//			{
//				//如有忙信号，此处置忙
//			}
//#endif
//		}
//		HAL_UART_Receive_IT(&huart2, (uint8_t *)g_ttl_rxByte, RXBUFFERSIZE);
    }
}
#endif
#endif
 

 




